package com.atguigu.gmall.user.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.constant.RedisConst;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.util.IpUtil;
import com.atguigu.gmall.model.user.LoginVo;
import com.atguigu.gmall.model.user.UserInfo;
import com.atguigu.gmall.user.service.UserAddressService;
import com.atguigu.gmall.user.service.UserInfoService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * ClassName: PassportApiController
 * Package: com.atguigu.gmall.user.controller
 * Description:
 *
 * @Author 刘轩
 * @Create 2023-08-30 15:59
 * @Version 1.0
 */

@Api(tags = "用户登录")
@RestController
@RequestMapping("/api/user/passport")
public class PassportApiController {

 @Autowired
 private RedisTemplate redisTemplate;

 @Autowired
 private UserInfoService userInfoService;


 /**
  * 登录信息
  * @param loginVo
  * @return
  */
 @PostMapping("login")
 public Result login(@RequestBody LoginVo loginVo, HttpServletRequest request){
  //  调用服务层方法
  UserInfo userInfo =  this.userInfoService.login(loginVo);
  if (null != userInfo){
   //  生成token
   String token = UUID.randomUUID().toString();
   //  创建Map 集合
   HashMap<String, Object> map = new HashMap<>();
   map.put("token",token);
   map.put("nickName",userInfo.getNickName());

   //  需要将用户信息存储到公共的位置---redis！
   //  数据类型 --- key  value 的内容 -- userId
   //  key = user:login:userId
   String key = RedisConst.USER_LOGIN_KEY_PREFIX + token;

   //  token 如果被盗用? 怎么办? ip 地址， 获取 公司域名! if(ip host){return}
   String ip = IpUtil.getIpAddress(request);
   JSONObject userJson = new JSONObject();
   userJson.put("userId",userInfo.getId().toString());
   userJson.put("ip",ip);
   //  userId ip 地址  if(缓存ip === 当前的ip){return userId}  cookie 不安全，为什么还要使用! 可以使用本地缓存 local storage
   //  cookie 被禁用！
   this.redisTemplate.opsForValue().set(key,userJson.toString(),RedisConst.USERKEY_TIMEOUT, TimeUnit.SECONDS);

   //  log.info("谁是谁"+ip);
   //  sendMsg(ip);  --->
   //  登录成功.
   return  Result.ok(map);
  }
  return Result.fail().message("登录失败.");
 }

 /**
  * 退出登录
  * @return
  */
 @GetMapping("logout")
 public Result logout(@RequestHeader String token, HttpServletRequest request){
  //  删除缓存数据
  //  必须先获取到缓存的key ,token 存在 cookie中
  //        String token = "";
  //        Cookie[] cookies = request.getCookies();
  //        for (Cookie cookie : cookies) {
  //            if (cookie.getName().equals("token")) {
  //                token = cookie.getValue();
  //            }
  //        }
  //  组成缓存的key
  String loginKey = RedisConst.USER_LOGIN_KEY_PREFIX+token;
  this.redisTemplate.delete(loginKey);
  return Result.ok();
 }
}